From 610d3bccf1cb640e2a21df28d8d2a954c2bf337e Mon Sep 17 00:00:00 2001
From: dujinkim <dujin.kim@dtsolution.co.kr>
Date: Thu, 5 Jun 2025 01:53:35 +0000
Subject: (대표님) 변경사항 0604 - OCR 관련 및 drizzle generated sqls
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 app/[lng]/partners/ocr/page.tsx | 133 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 133 insertions(+)
 create mode 100644 app/[lng]/partners/ocr/page.tsx

(limited to 'app/[lng]/partners/ocr/page.tsx')

diff --git a/app/[lng]/partners/ocr/page.tsx b/app/[lng]/partners/ocr/page.tsx
new file mode 100644
index 00000000..b75df420
--- /dev/null
+++ b/app/[lng]/partners/ocr/page.tsx
@@ -0,0 +1,133 @@
+import * as React from "react"
+import { type SearchParams } from "@/types/table"
+import { getValidFilters } from "@/lib/data-table"
+import { Skeleton } from "@/components/ui/skeleton"
+import { DataTableSkeleton } from "@/components/data-table/data-table-skeleton"
+import { Shell } from "@/components/shell"
+import { getServerSession } from "next-auth"
+import { authOptions } from "@/app/api/auth/[...nextauth]/route"
+import Link from "next/link"
+import { Button } from "@/components/ui/button"
+import { LogIn } from "lucide-react"
+import { searchParamsCache } from "@/lib/welding/validation"
+import { getOcrRows } from "@/lib/welding/service"
+import { OcrTable } from "@/lib/welding/table/ocr-table"
+
+interface IndexPageProps {
+  searchParams: Promise<SearchParams>
+}
+
+export default async function IndexPage(props: IndexPageProps) {
+  const searchParams = await props.searchParams
+  const search = searchParamsCache.parse(searchParams)
+  const validFilters = getValidFilters(search.filters)
+  
+  // Get session
+  const session = await getServerSession(authOptions)
+  
+  // Check if user is logged in
+  if (!session || !session.user) {
+    // Return login required UI instead of redirecting
+    return (
+      <Shell className="gap-6">
+        <div className="flex items-center justify-between">
+          <div>
+            <h2 className="text-2xl font-bold tracking-tight">
+              Welding OCR
+            </h2>
+            <p className="text-muted-foreground">
+            PDF 파일을 업로드하면 테이블에 값이 삽입됩니다. 
+            </p>
+          </div>
+        </div>
+
+        <div className="flex flex-col items-center justify-center py-12 text-center">
+          <div className="rounded-lg border border-dashed p-10 shadow-sm">
+            <h3 className="mb-2 text-xl font-semibold">로그인이 필요합니다</h3>
+            <p className="mb-6 text-muted-foreground">
+              OCR을 사용하려면 먼저 로그인하세요.
+            </p>
+            <Button size="lg" asChild>
+              <Link href="/partners">
+                <LogIn className="mr-2 h-4 w-4" />
+                로그인하기
+              </Link>
+            </Button>
+          </div>
+        </div>
+      </Shell>
+    )
+  }
+  
+  // User is logged in, proceed with vendor ID
+  const vendorId = session.user.companyId
+  
+  // Validate vendorId (should be a number)
+  const idAsNumber = Number(vendorId)
+  
+  if (isNaN(idAsNumber)) {
+    // Handle invalid vendor ID (this shouldn't happen if authentication is working properly)
+    return (
+      <Shell className="gap-6">
+        <div className="flex items-center justify-between">
+          <div>
+            <h2 className="text-2xl font-bold tracking-tight">
+              RFQ
+            </h2>
+          </div>
+        </div>
+        <div className="flex flex-col items-center justify-center py-12 text-center">
+          <div className="rounded-lg border border-dashed p-10 shadow-sm">
+            <h3 className="mb-2 text-xl font-semibold">계정 오류</h3>
+            <p className="mb-6 text-muted-foreground">
+              업체 정보가 올바르게 설정되지 않았습니다. 관리자에게 문의하세요.
+            </p>
+          </div>
+        </div>
+      </Shell>
+    )
+  }
+  
+  // If we got here, we have a valid vendor ID
+  const promises = Promise.all([
+    getOcrRows({
+      ...search,
+      filters: validFilters,
+    })
+  ])
+  
+  return (
+    <Shell className="gap-2">
+      <div className="flex items-center justify-between space-y-2">
+        <div className="flex items-center justify-between space-y-2">
+          <div>
+            <h2 className="text-2xl font-bold tracking-tight">
+              RFQ
+            </h2>
+            <p className="text-muted-foreground">
+              RFQ를 응답하고 커뮤니케이션을 할 수 있습니다.
+            </p>
+          </div>
+        </div>
+      </div>
+      
+      <React.Suspense fallback={<Skeleton className="h-7 w-52" />}>
+        {/* DateRangePicker can go here */}
+      </React.Suspense>
+      
+      <React.Suspense
+        fallback={
+          <DataTableSkeleton
+            columnCount={6}
+            searchableColumnCount={1}
+            filterableColumnCount={2}
+            cellWidths={["10rem", "40rem", "12rem", "12rem", "8rem", "8rem"]}
+            shrinkZero
+          />
+        }
+      >
+        <OcrTable promises={promises} />
+      </React.Suspense>
+    </Shell>
+  )
+}
\ No newline at end of file
-- 
cgit v1.2.3

